package br.com.polo.contas.persistencia.dao;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import javax.persistence.criteria.CriteriaQuery;
import br.com.polo.contas.dominio.EntidadeBase;
import br.com.polo.contas.persistencia.dao.repositorio.DAO;

public class DAOBean implements DAO {

	@PersistenceContext(name="contas-persistencia")
	protected EntityManager em;

	@Override
	public <T extends EntidadeBase> void adiciona(T obj) throws PersistenceException {
		em.persist(obj);
	}

	@Override
	public <T extends EntidadeBase> void remove(T obj) {
		em.remove(obj);
	}

	@Override
	public <T extends EntidadeBase> void atualiza(T obj) {
		em.merge(obj);
	}

	@Override
	public <T extends EntidadeBase> List<T> listaTodos(Class<T> classe) {
		CriteriaQuery<T> query = em.getCriteriaBuilder().createQuery(classe);
		query.from(classe);
		return em.createQuery(query).getResultList();
	}

	@Override
	public <T extends EntidadeBase> T buscaPorId(Class<T> classe, T obj) {
		return em.find(classe, obj.getId());
	}

}
